package com.skh.string;

import java.util.Stack;

/**
 * @Author skh
 * @Date 2020/3/28 13:20
 * @Desc 解码字母到整数映射
 */
public class FreqAlphabets {
    /**
     * 给你一个字符串 s，它由数字（'0' - '9'）和 '#' 组成。我们希望按下述规则将 s 映射为一些小写英文字符：
     *
     * 字符（'a' - 'i'）分别用（'1' - '9'）表示。
     * 字符（'j' - 'z'）分别用（'10#' - '26#'）表示。 
     * 返回映射之后形成的新字符串。
     *
     * 题目数据保证映射始终唯一。
     *
     *  
     *
     * 示例 1：
     *
     * 输入：s = "10#11#12"
     * 输出："jkab"
     * 解释："j" -> "10#" , "k" -> "11#" , "a" -> "1" , "b" -> "2".
     * 示例 2：
     *
     * 输入：s = "1326#"
     * 输出："acz"
     * 示例 3：
     *
     * 输入：s = "25#"
     * 输出："y"
     * 示例 4：
     *
     * 输入：s = "12345678910#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#"
     * 输出："abcdefghijklmnopqrstuvwxyz"
     */


    /**
     * 解法一：栈
     * 具有 FILO 特性的栈是最适合处理这种先存储后处理的问题了。
     *
     * 定义一个存储字符的 stack（可以用工具类，也可用数组模拟），遍历字符串 s，遇到不是 # 的字符入栈，遇到字符 #，弹出先前入栈的 2 个栈顶字符，并将这两个字符转成相应的数字 digit 后，再转为对应的字母 letter，然后存入栈中。重复上述过程置遍历结束。
     *
     */
    public String freqAlphabets(String s) {
        Stack<Character> stack = new Stack<>();
        char[] chars = s.toCharArray();

        for (int i = 0; i < chars.length; i++) {
            if (chars[i] != '#') {
                stack.push((char) (chars[i] - '0' + 96)); // a的ASCII为97
            } else {
                stack.pop();
                stack.pop();
                int digit = (chars[i-2] - '0') * 10 + chars[i-1] - '1';
                char letter = (char) (digit + 'a');
                stack.push(letter);
            }
        }
        StringBuilder sb = new StringBuilder();
        for (Character C : stack) {
            sb.append(C);
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        String s = "3112";
        char[] chars = s.toCharArray();
        System.out.println((char)('1'-'0'+97));
        System.out.println('a');
    }
}
